import gradio as gr
import json
import socket
from openai import OpenAI

# 从 JSON 文件加载 API Key 和 base URL
def load_config():
    with open("config.json") as f:
        config = json.load(f)
    return config

# 初始化 Moonshot API 客户端
config = load_config()
client = OpenAI(
    api_key=config["api_key"],
    base_url=config["base_url"]
)

# 初始化对话历史
history = [
    {"role": "system", "content": "你是 Kimi，由 Moonshot AI 提供的人工智能助手，你更擅长中文和英文的对话。你会为用户提供安全，有帮助，准确的回答。同时，你会拒绝一切涉及恐怖主义，种族歧视，黄色暴力等问题的回答。Moonshot AI 为专有名词，不可翻译成其他语言。"}
]

# 调用 Moonshot Kimi 模型的聊天函数
def chat(query, chat_history):
    global history  # 使用全局的历史记录
    history.append({"role": "user", "content": query})
    
    # 使用 Moonshot API 完成聊天
    completion = client.chat.completions.create(
        model="moonshot-v1-8k",
        messages=history,
        temperature=0.3
    )
    
    # 获取模型生成的响应
    result = completion.choices[0].message.content
    history.append({"role": "assistant", "content": result})
    
    # 更新 Gradio 的 chat_history 以显示对话记录
    chat_history.append({"role": "user", "content": query})
    chat_history.append({"role": "assistant", "content": result})
    
    # 返回更新后的 chat_history 和清空的输入框内容
    return chat_history, ""

# 获取本机 IP 地址
def get_local_ip():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(("8.8.8.8", 80))
        ip = s.getsockname()[0]
    finally:
        s.close()
    return ip

# 使用 Gradio 创建用户界面，使用 Chatbot 组件
with gr.Blocks() as demo:
    gr.Markdown("<h1 style='text-align: center;'>Kimi人工智能助手</h1>")
    chatbot = gr.Chatbot(type="messages")  # 设置 type="messages" 以使用 role 和 content 格式
    msg = gr.Textbox(label="输入您的问题：")  # 输入框
    submit = gr.Button("发送")  # 发送按钮

    # 定义发送按钮的事件
    submit.click(chat, inputs=[msg, chatbot], outputs=[chatbot, msg])
    msg.submit(chat, inputs=[msg, chatbot], outputs=[chatbot, msg])  # 支持按回车键发送

# 启动 Gradio 应用
if __name__ == "__main__":
    ip = get_local_ip()
    demo.launch(share=True, server_name=ip, server_port=7860)
    print(f"Server is running at http://{ip}:7860")